/********************************************************************************
  * @文件名:
  *     screenshotswidget.cpp
  * @作者:
  *     xcl
  * @说明:
  *     该文件的主要功能是截屏控件的实现文件
  * @注意:
  *     无
  *******************************************************************************/
#include "screenshotswidget.h"
#include <QGuiApplication>
#include <QScreen>
#include <QWindow>
#include <QStandardPaths>
#include <QDir>
#include <QFileDialog>
#include <QImageWriter>
#include <QMessageBox>
#include <QPainter>
#include <QBitmap>
#include <QDebug>
#include <QClipboard>
#include <QApplication>
/******************************************************************************
  * @说明:
  *     构造函数
  * @参数:
  *     parent:父控件的指针
  * @返回值:
  *     无
  ****************************************************************************/
ScreenshotsWidget::ScreenshotsWidget(QWidget *parent) : QWidget(parent)
{
    startPos.setX(0);
    startPos.setY(0);
    endPos = startPos;
}

/******************************************************************************
  * @说明:
  *     加载整个屏幕图像，方便截取
  * @参数:
  *     无
  * @返回值:
  *     无
  ****************************************************************************/
void ScreenshotsWidget::LoadPixmapSlot()
{
    QScreen *screen = QGuiApplication::primaryScreen();
    if (const QWindow *window = windowHandle())
        screen = window->screen();
    if (!screen)
        return;
    originalPixmap = screen->grabWindow(0);
    startPos = endPos;
    showFullScreen();
}

/******************************************************************************
  * @说明:
  *     绘制函数重载
  * @参数:
  *     event：事件指针
  * @返回值:
  *     无
  ****************************************************************************/
void ScreenshotsWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setOpacity(0.3);
    painter.drawPixmap(originalPixmap.rect(), originalPixmap);
    if(startPos != endPos)
    {
        QPoint topLeftPos(startPos.rx() < endPos.rx() ? startPos.rx() : endPos.rx(),\
                          startPos.ry() < endPos.ry() ? startPos.ry() : endPos.ry());


        QPoint bottomRight(startPos.rx() > endPos.rx() ? startPos.rx() : endPos.rx(),\
                           startPos.ry() > endPos.ry() ? startPos.ry() : endPos.ry());

        QRect rect(topLeftPos, bottomRight);
        subPixmap = originalPixmap.copy(rect);
        painter.setOpacity(1);
        painter.drawPixmap(rect, subPixmap);
        painter.drawRect(rect);
    }

    event->accept();
}

/******************************************************************************
  * @说明:
  *     鼠标按下事件函数的重载
  * @参数:
  *     event：事件指针
  * @返回值:
  *     无
  ****************************************************************************/
void ScreenshotsWidget::mousePressEvent(QMouseEvent *event)
{
    startPos = event->pos();
}

void ScreenshotsWidget::mouseReleaseEvent(QMouseEvent *event)
{
    QClipboard *clipboard = QApplication::clipboard();
    clipboard->setPixmap(subPixmap);
    emit ScreenShotFinishSignal(subPixmap);
    close();
    event->accept();
}


/******************************************************************************
  * @说明:
  *     鼠标移动函数的重载
  * @参数:
  *     event：事件指针
  * @返回值:
  *     无
  ****************************************************************************/
void ScreenshotsWidget::mouseMoveEvent(QMouseEvent *event)
{
    endPos = event->pos();
    update();
    event->accept();
}

/******************************************************************************
  * @说明:
  *     获取截取的图像
  * @参数:
  *     无
  * @返回值:
  *     截取图像的QPixmap类的对象
  ****************************************************************************/
QPixmap ScreenshotsWidget::GetPixmap(void)
{
    return subPixmap;
}
